#ifndef SERVICEOPERATE_H_
#define SERVICEOPERATE_H_

#include "rclcpp/rclcpp.hpp"
#include <jsoncpp/json/json.h>

#define MAX_CLIENT_NUM 35

class CServiceOperate
{
public:
    CServiceOperate(std::shared_ptr<rclcpp::Node> nh);
    ~CServiceOperate();

    void setSendDataProcessor(std::function<void(std::vector<int>, std::string)> processor);
    void recvJsonData_call(const int id, const Json::Value &root);
    void recvJsonData_pub(const Json::Value &root);

private:
    std::shared_ptr<rclcpp::Node> m_nh;
    bool m_cServiceOperateInitOk = false;

    // ros::ServiceClient m_srvClient[MAX_CLIENT_NUM];
    std::vector<rclcpp::ClientBase::SharedPtr> m_srvClients; 
    std::vector<std::string> m_srvNameList;
    
    // 使用基类指针
    // ros::Publisher m_publishers[5]; //
    std::vector<rclcpp::PublisherBase::SharedPtr> m_publishers; 
    // 回调(仅存一个ID，为统一格式，此处将ID放入vector中)
    std::function<void(std::vector<int>, std::string)> m_vSendDataProcessor;

    // 初始化
    bool init();

    Json::Value callService(const std::string &srvName, const Json::Value &json_args, bool &result);
    void callFaildProgram(const int srvIndex, Json::Value &json_values);

    // 通用call函数,回复字段为success和message
    template <typename T>
    Json::Value callSrv_gen_success_message(
        typename T::Request::SharedPtr request, 
        const int srvIndex, bool &result);

    // 通用call函数,回复字段为success和error
    template <typename T>
    Json::Value callSrv_gen_success_error(
        typename T::Request::SharedPtr request, 
        const int srvIndex, bool &result);

    // 通用call函数,回复字段为status，status为string/bool等类型
    template <typename T>
    Json::Value callSrv_gen_status(
        typename T::Request::SharedPtr request, 
        const int srvIndex, bool &result);

    // 通用call函数,回复字段为status，status为agv_msgs::msg::StatusResponse等类型
    template <typename T>
    Json::Value callSrv_gen_status_msg(
        typename T::Request::SharedPtr request, 
        const int srvIndex, bool &result);

    // 具体对应srv格式类型的call函数
    Json::Value callSrv_DynParam(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_StaticParam(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_ChangeNavType(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_V_localOrder(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_V_instantActions(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_LidarCalib(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_QRCalib(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_SetLaserCalib(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_OdomCalib(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_GetMapList(const int srvIndex, const Json::Value &json_args, bool &result);
    // Json::Value callSrv_reflector_NavTask(const int srvIndex, const Json::Value &json_args, bool &result);
    // Json::Value callSrv_save_reflector_map(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_Relocate(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_SetOperationMode(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_file_transform(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_OutputInterface(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_log_transform(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_SetBool(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_EditMap(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_SetLoactionMode(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_SaveMap(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_AutoCalib(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_LaserFilter(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_GetMapPoint(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_ChangeMap(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_GetLandmarkLists(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_Version(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_FirmwareUpdate(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_FtpRequest(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_Syncmap(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_AvoidObstaUpdate(const int srvIndex, const Json::Value &json_args, bool &result);
    Json::Value callSrv_AvoidObstaSwitch(const int srvIndex, const Json::Value &json_args, bool &result);

    // 参数服务器读取设置
    Json::Value ros_param_get(const Json::Value &json_args, bool &result);
    Json::Value ros_param_set(const Json::Value &json_args, bool &result);

    // 获取参数值并转换为 Json::Value
    Json::Value getRosParamValue(const std::string &param_name, bool &success,const bool output_string);
    // 递归构建 Json::Value 对象
    Json::Value buildRosParamJsonForNode(int &obtained_num, const std::string &node_namespace, const std::vector<std::string> &name_list);

    // 删除字符串两端的空格
    void trimStringValue(std::string &str_value);

    // 判断参数设置值类型
    bool isStringValue(std::string &str_value);
    bool isIntValue(const std::string &str_value);
    bool isDoubleValue(const std::string &str_value);
    bool isBoolValue(const std::string &str_value);

    // 发布消息
    template <typename T>
    void publishMsg(const int index, const T &msg);
};

#endif